$title IORUTINES FOR TDV 2124           Date: 14/08-84
;
;       I/O port addresses
;
        prnstat equ     0F5h    ;printer status
        prndata equ     0F4h    ;printer data
        scrstat equ     0f6h    ;screen status
        scrdata equ     0e5h    ;screen data
        kbstat  equ     0f6h    ;keyboard status
        kbdata  equ     0e6h    ;keyboard data
        PUNSTAT EQU     0F7H    ;PUNCH STATUS
        PUNDAT  EQU     0E4H    ;PUNCH DATA
        RDRSTAT EQU     0F7H    ;READER STATUS
        RDRDAT  EQU     0E4H    ;READER DATA
;
;
PUBLIC  CONST,CONIN,CONOUT,LIST,LISTST,PUNCH,READER
;
EXTRN   DLECNT
;----------------------------------------------------------------------
;
        cseg
;
const:  ;console status, return 0ffh if character ready, 00h if not
        in      kbstat
        ani     4
        rz
        mvi     a,0ffh
        ret
;
conin:  ;console character into register a
        call    const
        ana     a
        jz      conin
        in      kbdata
        ani     7fh
        ret
;
conout: ;console character output from register c
        LDA     DLECNT
        ANA     A
        JNZ     DLEOUT
        MOV     A,C
        CPI     11H
        JZ      DLESET
OUTC:
        mov     a,c
        out     scrdata ;write on screen with controll decoding
        NOP
        NOP
        in      scrstat ;read status
        ani     18h     ;screen busy during write
        jnz     OUTC    ;try again
        ret
;
DLESET:
        MVI     A,2
        STA     DLECNT
        MVI     C,10H
        JMP     OUTC
;
DLEOUT:
        DCR     A
        STA     DLECNT
        MOV     A,C
        SUI     20H
        MOV     C,A
        JMP     OUTC
;
 
list:   ;list character from register c
       call    listst
       ana     a
       jz      list    ;printer busy
       mov     a,c
       out     prndata ;print data
       ret             ;null subroutine
 
listst: ;return list status (0 if not ready, 1 if ready)
       in      prnstat ;printer status port
       rar
       jnc     listse  ;transmitter buffer not empty
       in      prnstat
       ral
       jnc     listse  ;printer busy
       mvi     a,001h  ;printer ready
       ret
;
listse:
        xra     a       ;printer busy
        ret
;
punch:  ;punch character from register c
        in      PUNSTAT
        ani     1
        jz      punch
        mov     a,c
        out     PUNDAT
        ret             ;null subroutine
;
reader: ;read character into register a from reader device
        in      RDRSTAT
        ani     2
        jz      reader
        in      RDRDAT
        ani     7fh     ;remember to strip parity bit
        ret
;
        END
